import { Context, Next } from 'koa'
import { loggerFactory } from '@/util/Log4jsUtil'
import { responseExp } from '@/util/ResponseResultBuilder'
import { SystemException } from '@/exception/SystemException'

const logger = loggerFactory('error')
// 这个middleware处理在其它middleware中出现的异常
// 并将异常消息回传给客户端：{ code: '错误代码', msg: '错误信息' }
export const errorHandler = (ctx: Context, next: Next) => {
  return next().catch((err) => {
    logger.error(err.stack)

    if (err.status === 401) {
      ctx.status = 401
      ctx.body = '您暂时无权访问受保护的资源'
    } else if (err instanceof SystemException) {
      const sysExp = err as SystemException
      responseExp(ctx, sysExp.getErrorMsg(), sysExp.getBizCode())
      // 保证返回状态是 200, 这样前端不会抛出异常
      ctx.status = sysExp.getHttpStatusCode()
    } else {
      responseExp(ctx, `${ctx.method} ${ctx.url} 接口执行发生非预期异常!`, 500)
      // 保证返回状态是 200, 这样前端不会抛出异常
      ctx.status = 200
    }
    return Promise.resolve()
  })
}
